package cn.wolfcode.springboot.config;

import cn.wolfcode.springboot.domain.MyDataSource;
import cn.wolfcode.springboot.domain.OtherBean;
import cn.wolfcode.springboot.domain.SomeBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

/**
 * @author liuquan
 * @program: springboot
 * @description: 配置类, 代替xml配置bean的类
 * @date 2021-02-08 11:34:36
 */
@Configuration //表示该类是spring的配置类
//@ComponentScan  //开启组件扫描器,相当于之前的注解解析器 ,默认扫描当前类所在包及其子包
//@EnableConfigurationProperties
public class JavaConfig {
    /**
     *
     * @Bean 代表当前方法是用来声明bean的,返回的结果会交给spring管理,方法名就是bean的id
     *  相当于<bean id="someBean" class="cn.wolfcode.common.SomeBean"/>
     * @return  返回对象交给Spring管理
     */
    @Bean
    public OtherBean otherBean(){
        return  new OtherBean();
    }

    /**
     *    等同于 <bean id="dataSource"
     *     class="com.alibaba.druid.pool.DruidDataSource"
     *     init-method="init" destroy-method="close">
     *  依赖bean的注入:
     *  1.通过方法形参注入
     *  2.通过调用方法注入
     *  3.贴注解注入
     */
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public SomeBean someBean(OtherBean otherBean){
        SomeBean someBean = new SomeBean();
        //方式一:方法形参注入
        someBean.setOtherBean(otherBean);
        //方式二:直接调方法注入
        //someBean.setOtherBean(otherBean());
        return someBean;
    }

    //方式一,通过方法形参进行参数设置
   /* @Bean
    public MyDataSource myDataSource(@Value("${jdbc.username}") String username){
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setUsername(username);
        return  myDataSource;
    }*/

    //方法二,通过注解进行参数设置
    /*@Bean
    @ConfigurationProperties(prefix = "jdbc")
    public MyDataSource myDataSource(){
        MyDataSource myDataSource = new MyDataSource();

        return  myDataSource;
    }*/
    /**
     * environment:表示Spring的环境对象,该对象包含了加载的属性数据
     * 可以获取到application.properties里面的参数, 也可以获取到@PropertySource中的参数
     * 但application.properties的优先级比@PropertySource高
     */
    @Autowired
    private Environment environment;
    @Bean
    public MyDataSource myDataSource(){
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setUsername(environment.getProperty("jdbc.username"));
        myDataSource.setPassword(environment.getProperty("jdbc.password"));
        return  myDataSource;
    }


    /**
     *  在实体类使用 @ConfigurationProperties("jdbc") 注解的方式设置参数
     * @return
     */
   /* @Bean
    public MyDataSource myDataSource(){
        MyDataSource myDataSource = new MyDataSource();

        return  myDataSource;
    }*/
}
